//线程学习
//创建多线程

#include <iostream>
#include <string>
#include <pthread.h>
#include <vector>
#include <thread>
#include <unistd.h>
//pthrea_cancel(tid) //取消该线程
//pthread_join(tid,&ret) //新线程的执行结果，通过ret拿到
//pthread_exit()可以用来终止线程，exit()是用来终止进程的
//pthread_detach(pthread_self()//线程id) 分离进程,主线程就不需要等待该线程了
const int num=10;
void* routine(void* args)
{
    sleep(1);
    std::string name=static_cast<char*>(args);
    int cnt=5;
    while(cnt--)
    {
        std::cout<<"新线程的名字"<<name<<std::endl;
        sleep(1);
    }
    return nullptr;
}
int main()
{
    std::vector<pthread_t> tids;
    for(int i=0;i<num;i++)
    {
        pthread_t  tid;
        char* id=new char[64];
        snprintf(id,64,"thread-%d",i);
        int n=pthread_create(&tid,nullptr,routine,id);
        if(n==0)
            tids.push_back(tid);
        else
            continue;
    }
    //等待线程
    for(int i=0;i<num;i++)
    {
        int n=pthread_join(tids[i],nullptr);
        if(n==0)
        {
            std::cout<<"等待新线程成功！"<<std::endl;
        }
    }
    return 0;
}

// std::string Format(const pthread_t& tid)
// {
//     char id[64];
//     snprintf(id,sizeof(id),"0x%lx",tid);
//     return id;
// }
// void* routine(void* args)
// {
//     std::string name=static_cast<char*>(args);
//     //获取当前线程的线程id
//     pthread_t id=pthread_self();
//     std::cout<<"我是一个新线程，线程id:"<<Format(id)<<std::endl;
//     return (void*)123;//退出码
// }
// int main()
// {
//     pthread_t tid;
//     int n=pthread_create(&tid,nullptr,routine,(void*)"thread-1");
//     std::cout<<"我是主线程，线程id:"<<Format(tid)<<std::endl;
//     sleep(1);
//     return 0;
// }
//c++11引入的线程库
// void hello()
// {
//     while(true)
//     {
//         sleep(1);
//         std::cout<<"我是新线程"<<getpid()<<std::endl;
//     }
// }
// int main()
// {
//     std::thread t(hello);
//     while(true)
//     {
//         sleep(1);
//         std::cout<<"我是主线程"<<getpid()<<std::endl;
//     }
//     return 0;
// }
// int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
//                    void *(*start_routine) (void *), void *arg);


// void* threadrun(void* args)
// {
//     std::string name=static_cast<char*>(args);
//     while(true)
//     {
//         sleep(1);
//         std::cout<<"我是新线程:"<<getpid()<<std::endl;
//         int a=10;
//         a/=0;
//     }
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,threadrun,(void*)"thread-1");
//     while(true)
//     {

//     }
//     return 0;
// }